name: CI - Node.js
env:
  NODE_OPTIONS: '--max_old_space_size=6144'

on:
  # Run on push events, but only for the below branches
  push:
    branches:
      - 'main'
      - 'prod-**'
  # Run on pull requests, but only for the below targets
  pull_request:
    branches:
      - 'main'
      - 'next-**'
  # Run on Merge Queue
  merge_group:
    types: [checks_requested]

permissions:
  contents: read

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        node-version: [20.x]
      fail-fast: false

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Check number of lockfiles
        run: |
          if [ $(find . -name 'package-lock.json' | grep -vc -e 'node_modules') -gt 0 ]
          then
            echo -e 'Error: found package-lock files in the repository.\nWe use pnpm workspaces to manage packages so all dependencies should be added via pnpm add'
            exit 1
          fi

      - name: Setup pnpm
        uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          echo 'SHOW_NEW_CURRICULUM=true' >> .env
          cat .env

      - name: Install node_modules
        run: pnpm install

      - name: Check formatting
        run: |
          pnpm prettier --check . || [ $? -eq 1 ] && printf "\nTip: Run 'pnpm run format' in your terminal to fix this.\n\n"

      # The two prefixed installs are for the client update which are not,
      # currently, built as workspaces.
      - name: Lint Source Files
        run: |
          echo pnpm version $(pnpm -v)
          pnpm run create:shared
          npm i --prefix=curriculum-server
          npm i --prefix=web
          pnpm run build:curriculum
          pnpm run lint

  # DONT REMOVE THIS JOB.
  # TODO: Refactor and use re-usable workflow and shared artifacts
  build:
    name: Build
    needs: lint
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        node-version: [20.x]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup pnpm
        uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set freeCodeCamp Environment Variables
        run: cp sample.env .env

      - name: Install and Build
        run: |
          pnpm install
          pnpm run build

  test:
    name: Test
    needs: build
    runs-on: ubuntu-22.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [20.x]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup pnpm
        uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@b0a1493307c4e9b82ed61f3858d606c5ff190c64 # v1.10.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:shared
          pnpm run build:curriculum

      - name: Run Tests
        run: pnpm test

  test-upcoming:
    name: Test - Upcoming Changes
    needs: build
    runs-on: ubuntu-22.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [20.x]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup pnpm
        uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          echo 'SHOW_UPCOMING_CHANGES=true' >> .env
          echo 'SHOW_NEW_CURRICULUM=true' >> .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@b0a1493307c4e9b82ed61f3858d606c5ff190c64 # v1.10.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:shared
          pnpm run build:curriculum

      - name: Run Tests
        run: pnpm test

  test-localization:
    name: Test - i18n
    needs: build
    runs-on: ubuntu-22.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [20.x]
        locale: [portuguese, italian]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup pnpm
        uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@b0a1493307c4e9b82ed61f3858d606c5ff190c64 # v1.10.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        env:
          CURRICULUM_LOCALE: ${{ matrix.locale }}
          CLIENT_LOCALE: ${{ matrix.locale }}
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:shared

      # DONT REMOVE THIS STEP.
      # TODO: Refactor and use re-usable workflow and shared artifacts
      - name: Build Client in ${{ matrix.locale }}
        env:
          CURRICULUM_LOCALE: ${{ matrix.locale }}
          CLIENT_LOCALE: ${{ matrix.locale }}
        run: |
          pnpm run build

      - name: Run Tests
        env:
          CURRICULUM_LOCALE: ${{ matrix.locale }}
          CLIENT_LOCALE: ${{ matrix.locale }}
        run: pnpm test
